﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using OBL1_DiseñoDeAplicaciones.ObjetosDeNegocio;
using OBL1_DiseñoDeAplicaciones.Utilidades;

namespace OBL1_DiseñoDeAplicaciones.Interfaz
{
    public partial class Cliente_AltaModificacion : Form, IObservado
    {
        private const string __modoOperativoModificar = "Modificar";
        private const string __modoOperativoAgregar = "Agregar";

        private Empresa empresa;
        private string modoOperativo = string.Empty;
        private List<IObservador> observadores = new List<IObservador>();
        private Cliente clienteSeleccionado;

        public Cliente_AltaModificacion(string pModoOperativo, Cliente pCliente, IObservador pObs)
        {
            InitializeComponent();
            empresa = Empresa.GetInstance();
            this.agregarObservador(pObs);
            clienteSeleccionado = pCliente;
            if (pModoOperativo.Equals(__modoOperativoModificar))
            {
                modoOperativo = __modoOperativoModificar;
                //Cargo los datos
                this.txtNombre.Text = clienteSeleccionado.Nombre;
                this.txtDireccion.Text = clienteSeleccionado.Direccion;
                this.txtRuc.Text = clienteSeleccionado.Ruc;
                this.txtRuc.Enabled = false;
                this.Text = "Modificación de cliente";
                this.chkExentoIva.Visible = false;
            }
            else {
                modoOperativo = __modoOperativoAgregar;
                this.txtRuc.Enabled = true;
            }
        }

        #region OBSERVADO
        
        public void agregarObservador(IObservador obs)
        {
            // Agrega un objeto Observador a la colección
            observadores.Add(obs);
        }
       
        public void removerObservador(IObservador obs)
        {
            observadores.Remove(obs);

        }

        public void notificarTodos()
        {
            foreach (IObservador i in observadores)
            {
                i.actualizar();

            }

        }
       
        #endregion 

        private void BtnGuardarCliente_Click(object sender, EventArgs e)
        {
            if (ValidarCamposRequeridos())
            {
                if (modoOperativo.Equals(__modoOperativoAgregar))
                {
                    empresa.AgregarCliente(txtNombre.Text, txtRuc.Text, txtDireccion.Text, chkExentoIva.Checked);
                }
                else
                {
                    //modificar
                    Cliente c = (from Cliente cli in empresa.Clientes where cli.Ruc == clienteSeleccionado.Ruc select cli).First();
                    c.Modificarme(txtNombre.Text, txtDireccion.Text);   
                }
                lblErrores.Visible = false;
                this.notificarTodos();
                this.Dispose();
                   
            }
        }

        private void BtnCancelarCliente_Click(object sender, EventArgs e)
        {
            this.Dispose();
        }

        private bool ValidarCamposRequeridos()
        {
            bool retorno = true;
            if (txtNombre.Text.Equals(""))
            {
                lblNombreRequerido.Visible = true;
                lblErrores.Text = "Debe ingresar un nombre";
                retorno = false;
            }
            else
            {
                lblNombreRequerido.Visible = false;
            }

            if (retorno && txtRuc.Text.Equals(""))
            {
                lblRucRequerido.Visible = true;
                lblErrores.Text = "Debe ingresar un Ruc";
                retorno = false;
            }
            else
            {
                try
                {
                    Int64 validacion = Int64.Parse(txtRuc.Text);
                    bool existeRuc = ((from Cliente cli in empresa.Clientes where cli.Ruc == txtRuc.Text select cli).Count() > 0);

                    if (existeRuc && modoOperativo.Equals(__modoOperativoAgregar))
                    {
                        lblRucRequerido.Visible = true;
                        lblErrores.Text = "El Ruc ingresado ya existe.";
                        retorno = false;
                    }
                    else
                    {
                        lblRucRequerido.Visible = false;
                    }
                }
                catch (FormatException)
                {
                    lblErrores.Text = "El ruc debe ser numerico";
                    lblErrores.Visible = true;
                    retorno = false;
                }
            }

            if (retorno)
            {
                lblErrores.Text = "";
            }
            else
            {
                lblErrores.Visible = true;
                lblErrores.Left = (this.Width - lblErrores.Width) / 2;
            }
            return retorno;
        }
    }
}
